package team.se.tms.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期转换工具类
 *
 * @author winkyle
 * @date 2018/11/6
 */
public class DateUtil {

    /**
     * 获取当前日期
     *
     * @return 当前日期
     * @create on 2018/11/10 by winkyle
     */
    public static Date getCurrentDate() {
        return new Date();
    }

    /**
     * 获取当前日期字符串
     *
     * @param format 日期格式
     * @return 格式化后的当前日期字符串
     * @create on 2018/11/10 by winkyle
     */
    public static String getCurrentDate(String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(new Date());
    }

    /**
     * 获取当前日期加条件之后的日期
     *
     * @param condition 条件 如Calendar.DATE:加天数;Calendar.HOUR:加小时等，详见{@link Calendar}
     * @param values 条件的值
     * @return 加条件之后的日期
     * @create on 2018/11/10 by winkyle
     */
    public static Date getDateByCondition(Integer condition, Integer values) {
        Calendar canlendar = Calendar.getInstance();
        canlendar.add(condition, values);
        return canlendar.getTime();
    }

    /**
     * 获取当前日期加条件之后的日期字符串
     *
     * @param condition 条件 如Calendar.DATE:加天数;Calendar.HOUR:加小时等，详见{@link Calendar}
     * @param values 条件的值
     * @param format 日期格式
     * @return 加条件之后格式化后的日期字符串
     * @create on 2018/11/10 by winkyle
     */
    public static String getDateByCondition(Integer condition, Integer values, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(getDateByCondition(condition, values, format));
    }

    /**
     * 按照参数format的格式，日期转字符串
     *
     * @param date 日期
     * @param format 日期格式
     * @return 格式化后的日期字符串
     * @create on 2018/11/10 by winkyle
     */
    public static String format(Date date, String format) {
        if (date == null) {
            return "";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 按照参数format的格式，字符串转日期
     *
     * @param date 日期字符串
     * @param format 日期格式
     * @return 格式化后的日期
     * @create on 2018/11/10 by winkyle
     */
    public static Date format(String date, String format) {
        if (StringUtil.isEmpty(date)) {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try {
            return sdf.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return new Date();
    }

    /**
     * 校验日期是否合法
     *
     * @param date 日期
     * @param format 日期格式
     * @return 日期合法返回true，否则返回false
     * @create on 2018/11/10 by winkyle
     */
    public static Boolean isValidDate(String date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try {
            return sdf.format(sdf.parse(date)).equals(date) ? true : false;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 比较两个日期大小
     *
     * @param one 日期1
     * @param two 日期2
     * @return 如果日期1>日期2，则返回1，如果日期1==日期2，则返回0，如果日期1<日期2，则返回-1
     * @create on 2018/11/10 by winkyle
     */
    public static Integer compareDate(Date one, Date two) {
        if (one.getTime() > two.getTime()) {
            return 1;
        }
        if (one.getTime() == two.getTime()) {
            return 0;
        }
        return -1;
    }

    /**
     * 比较两个日期大小
     *
     * @param one 日期1
     * @param two 日期2
     * @param format 日期格式
     * @return 如果日期1>日期2，则返回1，如果日期1==日期2，则返回0，如果日期1<日期2，则返回-1
     * @create on 2018/11/10 by winkyle
     */
    public static Integer compareDate(String one, String two, String format) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return compareDate(sdf.parse(one), sdf.parse(two));
    }

    /**
     * 获取两日期天数之差
     *
     * @param one 日期1
     * @param two 日期2
     * @return 两日期天数之差
     * @create on 2018/11/10 by winkyle
     */
    public static Long getDifferDay(Date one, Date two) {
        long day = (one.getTime() - two.getTime()) / (24 * 60 * 60 * 1000);
        return day;
    }

    /**
     * 获取两日期天数之差
     *
     * @param one 日期1
     * @param two 日期2
     * @param format 日期格式
     * @return 两日期天数之差
     * @create on 2018/11/10 by winkyle
     */
    public static Long getDifferDay(String one, String two, String format) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return getDifferDay(sdf.parse(one), sdf.parse(two));
    }

    /**
     * 获取两日期年数之差
     *
     * @param one 日期1
     * @param two 日期2
     * @return 两日期年数之差
     * @create on 2018/11/10 by winkyle
     */
    public static Long getDifferYear(Date one, Date two) {
        return getDifferDay(one, two) / 365;
    }

    /**
     * 获取两日期年数之差
     *
     * @param one 日期1
     * @param two 日期2
     * @param format 日期格式
     * @return 两日期年数之差
     * @create on 2018/11/10 by winkyle
     */
    public static Long getDifferYear(String one, String two, String format) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return getDifferYear(sdf.parse(one), sdf.parse(two));
    }


    /**
     * 获取两日期之差
     *
     * @param one 日期1
     * @param two 日期2
     * @return 两日期之差
     * @create on 2018/11/10 by winkyle
     */
    public static String getDifferDate(Date one, Date two) {
        String resultTimes = "";
        long times = one.getTime() - two.getTime();
        long year = (times / (24 * 60 * 60 * 1000)) / 365;
        long day = times / (24 * 60 * 60 * 1000) - year * 365;
        long hour = (times / (60 * 60 * 1000) - (year * 365 + day) * 24);
        long min = ((times / (60 * 1000)) - (year * 365 + day) * 24 * 60 - hour * 60);
        long sec = (times / 1000 - (year * 365 + day) * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        StringBuffer sb = new StringBuffer();
        if (year != 0) {
            sb.append(Math.abs(year) + "年");
        }
        if (day != 0) {
            sb.append(Math.abs(day) + "天");
        }
        if (hour != 0) {
            sb.append(Math.abs(hour) + "小时");
        }
        if (min != 0) {
            sb.append(Math.abs(min) + "分钟");
        }
        if (sec != 0) {
            sb.append(Math.abs(sec) + "秒");
        }
        if (!StringUtil.isEmpty(sb.toString())) {
            if (year > 0 || day > 0 || hour > 0 || min > 0 || sec > 0) {
                sb.append("后");
            } else {
                sb.append("前");
            }
        }
        resultTimes = sb.toString();
        return resultTimes;
    }

    /**
     * 获取两日期之差
     *
     * @param one 日期1
     * @param two 日期2
     * @param format 日期格式
     * @return 两日期之差
     * @create on 2018/11/10 by winkyle
     */
    public static String getDifferDate(String one, String two, String format) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return getDifferDate(sdf.parse(one), sdf.parse(two));
    }
}
